Operation Registry
概要
Apollo のプラットフォーム Apollo Engine に含まれる。
GraphQL API の Demand Control
クライアントアプリケーションに必要な特定の操作を許可する
予期しない、あるいは高コストが予測される操作が実行されるリスクを低減する
クライアントアプリケーション上で Operation を定義し、Apollo CLI 経由で Apollo Engine に送信する。Apollo Server は Apollo Engine からそれら操作のマニフェストを取得し、クライアントバンドルから登録されていない操作の実行を禁止する。
Persisted queries のようなもののように見えるが、Apollo Server 自体は別途 Persisted queries の機能も持ち合わせているので、別レイヤーで管理できることや、その登録のためのインタフェースも込みで提供している部分が異なる点に思える。
使い方
スキーマの登録
Schema Registry を参照。
クライアントバンドルの Operations の登録
クライアントバンドルはクライアント名で一意に識別される
JS, TS, .graphql ファイルをサポートしている
Apollo Client にランタイムに挿入される __typename フィールドをデフォルトでは含む
code:shell
$ npx apollo client:push \
--key <ENGINE_API_KEY> \
--clientName <CLIENT_IDENTIFIER> \
--includes="src/**/*.{ts,js,graphql}"
✔ Loading Apollo project
✔ Pushing client to Engine service <service>
サブスクリプションの無効化
Apollo Server 2.0 では subscription がデフォルトで有効になっているが、これは通常のリクエストパイプラインを利用していない別サーバーとして動作する。そのため、Operation Registry のプラグインはサブスクリプションにトリガーして動作することができず、サブスクリプションを介した操作を制限することができない。したがって、操作の safelisting を矯正したければ、サブスクリプションはオフにしておくべき。
Operation registry の Apollo Server への追加
apollo-server-plugin-operation-registry プラグインを Apollo Server に追加する。
code:shell
npm install apollo-server-plugin-operation-registry
code:js
const server = new ApolloServer({
// Existing configuration
typeDefs,
resolvers,
subscriptions: false,
// ...
// New configuration
plugins: [
require('apollo-server-plugin-operation-registry')({
forbidUnregisteredOperations: true,
}),
],
});
Apollo Engine と連携して Apollo Server を起動
Apollo Engine を参照。
Tips: 一時的な許可
ヘッダー情報から判別して一時的に禁止を解くことができるっぽい。
https://www.apollographql.com/docs/platform/operation-registry.html#Selective-enforcement